/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.ms.filecenter.application.action.file;

import cn.hallele.infrastructure.util.DateUtil;
import cn.hallele.infrastructure.util.FileUtil;
import cn.hallele.mc.sdk.filecenter.common.enums.FileTypeEnum;
import cn.hallele.ms.filecenter.application.action.file.config.FileProperties;
import cn.hallele.ms.filecenter.application.bo.FileBO;
import cn.hallele.ms.filecenter.application.das.FileBDDas;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

/**
 * hallele_ms_filecenter
 *
 * @author anle5
 * @since 2024/9/23 23:56
 */
@Slf4j
@Service
public class FileApplicationService {
    @Autowired
    private FileBDDas fileBDDas;

    @Autowired
    private FileProperties fileProperties;

    /**
     * 上传文件处理
     *
     * @param fileBO 文件业务对象
     * @return 文件业务对象
     */
    @Transactional(rollbackFor = Exception.class)
    public FileBO uploadFile(FileBO fileBO) {
        MultipartFile file = fileBO.getMultipartFile();
        fileBO.setFilename(file.getOriginalFilename());
        MultipartFile multipartFile = fileBO.getMultipartFile();
        fileBO.setFilepath(fileProperties.getActionPath().get(fileBO.getAction()));
        fileBO.setFileSize(multipartFile.getSize());
        fileBO.setCreateTime(DateUtil.nowDate());
        fileBO.setUpdateTime(DateUtil.nowDate());
        fileBO.setMd5(FileUtil.md5(multipartFile));
        fileBO.setFilename(multipartFile.getOriginalFilename());
//        fileDomain.setInitiator(NetUtil.getLoginUser().getUserId()); todo
        fileBO.setFiletype(FileTypeEnum.getByName(FileUtil.getFileSuffix(multipartFile)));
        return fileBDDas.uploadFile(fileBO);
    }

    /**
     * 检查文件是否存在
     *
     * @param md5 md5值
     * @return 如果存在会返回文件信息，否则返回null
     */
    public FileBO checkExist(String md5) {
        return null;
    }

    /**
     * 获取文件url地址
     *
     * @param id 文件id
     * @return 文件url
     */
    public String getFileUrl(Long id) {
        return fileBDDas.findById(id).getUrl();
    }

    /**
     * 获取文件的url路径，供前端下载/展示，但是有过期时间
     *
     * @param id id
     * @return url
     */
    public String getUrlWithExpires(Long id, int expires) {
        expires = Math.min(expires, fileProperties.getTempUrlMaxExpiresTime());
        expires = expires <= 0 ? fileProperties.getTempUrlDefaultExpiresTime() : expires;
        return fileBDDas.getUrlWithExpires(id, expires).getUrl();
    }
}
